# coding=utf-8
import SimpleHTTPServer
import BaseHTTPServer
import sys
import cgi
from DataFormater import DataFormater
import func_parse


# INF 8007 lab 3 - Mikaël Guillemot et Thibaut Stimpfling 
# Ce fichier est le point d'entre de l'application lab3
#
# Apres avoir observe BaseHTTPServer et SimpleHTTPServer et les exemples fourni,
# nous avons constater que le serveur que nous voulions implementer dans le
# cadre du lab2 etait presque entierement disponible. Le plus long aura ete
# d'apprendre a se servir de l'existant et de l'heritage.
# notre travail ici consiste a implementer la lethose do_POST. On reutilise 
# SimpleHTTPRequestHandler pour le reste. 
#
# NOTE : Ce serveur n'est absolument PAS securise ! 


class localHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    dataFormater = None
    parseur = None
    
    def do_POST(self):
        global rootnode
        try:
            # on recupere les informations contenu dans l'entete http
            ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
            # apres avoir verifier le contenu du formulaire (enctype = multipart/form-data)...
            if ctype == 'multipart/form-data':
                # on recupere le dico des balises du formulaire (c'est a ce moment que le fichier est chargé)
                form = cgi.parse_multipart(self.rfile, pdict)
            # si il n'y a pas d'exception on confirme la reception du post
            self.send_response(301)
            self.end_headers()
            
            
            header = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><title>INF8007 Lab3 - resultats</title><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body><a href=""> retour </a>&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;<b>Resultat de la recherche de cours: </b><br><br>'
            footer = '<p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01 Transitional" height="31" width="88"></a></p></body></html>'
            result = ""
            # on traite le formluaire
            if form.get('cb_titre') != None :
                if form.get('cb_titre')[0] == "selected":
                    keys = form.get('titre')[0]
                    data = dataFormater.getData();
                    matchingIndexs = parseur.process(0, keys, data)
                    result += dataFormater.webFormat("titre", keys, matchingIndexs)
            if form.get('cb_resp') != None :
                if form.get('cb_resp')[0] == "selected":
                    keys = form.get('resp')[0]
                    data = dataFormater.getData();
                    matchingIndexs = parseur.process(1, keys, data)
                    result += dataFormater.webFormat("responsable(s)", keys, matchingIndexs)
            if form.get('cb_descr') != None :
                if form.get('cb_descr')[0] == "selected":
                    keys = form.get('descr')[0]
                    data = dataFormater.getData();
                    matchingIndexs = parseur.process(2, keys, data)
                    result += dataFormater.webFormat("description", keys, matchingIndexs)
            if result.__len__()<1:
                result = "Requete invalide"
            #on ecrit la page de retour
            self.wfile.write(header)
            self.wfile.write(result)
            self.wfile.write(footer)
        except Exception as e:
            print "[EXCEPTION]:" + e.message
            pass

def start(HandlerClass=localHTTPRequestHandler,
         ServerClass=BaseHTTPServer.HTTPServer):
    BaseHTTPServer.test(HandlerClass, ServerClass)


# point d'entrée de l'application : on regle le port d'ecoute (attendu comme
# parametre par le serveur) et on initialise le dictionnaire
if __name__ == '__main__':
    sys.argv = ['', 8080]
    print "Server is starting!"
    print "Generate dictionary..."
    dataFormater = DataFormater()
    parseur = func_parse.parse_c()
    if parseur.dictionnaire_init(): 
        if dataFormater.loadXml():
            start()

